﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Entidades;
using System.Drawing;

namespace TCC_Hotel.Apresentacao.FluxoHospedesAgora
{
    public partial class ListarHospedes : System.Web.UI.Page
    {
        List<Fluxo_Hospedes> fluxoHospedes = null;
        FluxoHospedesService servico = new FluxoHospedesService();
        ParametroService servico_Parametro = new ParametroService();

        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Hospedes_Presentes)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            //recupera os parametros
            List<Parametros> parametrosAtuais = servico_Parametro.RecuperarParametros();

            lblCheckOut.Text = "Horário máximo para o check-out: " + parametrosAtuais.Where(i=>i.Codigo == "Horario_CheckOut").FirstOrDefault().Valor;
            if (!IsPostBack)
            {
                //Remove o cache para atualizar informação
                HttpContext.Current.Cache.Remove("Lista_Fluxo_Hospedes_Agora");
               
                //recupera todos os hóspedes faturados do banco de dados          
                ReloadGridView();
            }

        }

        /// <summary>
        /// Faz o reload do gridview quando necessário e consulta o cache
        /// </summary>
        private void ReloadGridView()
        {
            //Consulta as reservas de hóspedes faturados no banco e verifica o cache
            fluxoHospedes = servico.ListarFluxoHospedesAgoraCache();

            //busca por qualquer um dos nomes
            fluxoHospedes = fluxoHospedes.Where(i => i.Nome_1.ToUpper().Contains(txtBusca.Text.ToUpper())
                || i.Nome_2.ToUpper().Contains(txtBusca.Text.ToUpper())
                || i.Nome_3.ToUpper().Contains(txtBusca.Text.ToUpper())
                || i.Nome_4.ToUpper().Contains(txtBusca.Text.ToUpper())
                || i.Nome_5.ToUpper().Contains(txtBusca.Text.ToUpper())).OrderBy(i => i.Numero_Apartamento).ToList();


            //popular gridView
            grdHospedes.DataSource = fluxoHospedes;
            grdHospedes.DataBind();


        }

        /// <summary>
        /// Evento do botão de filtrar os nomes para facilitar a busca
        /// </summary>
        protected void btnBusca_Click(object sender, EventArgs e)
        {
            ReloadGridView();
        }

        /// <summary>
        /// Limpa a busca
        /// </summary>
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtBusca.Text = null;
            ReloadGridView();
        }

        /// <summary>
        /// Evento que controla a paginação e verifica o cache
        /// </summary>
        protected void grdHospedes_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            //Consulta as reservas de hóspedes faturados no banco e verifica o cache
            fluxoHospedes = servico.ListarFluxoHospedesAgoraCache();

            //busca por qualquer um dos nomes
            fluxoHospedes = fluxoHospedes.Where(i => i.Nome_1.ToUpper().Contains(txtBusca.Text.ToUpper())
                || i.Nome_2.ToUpper().Contains(txtBusca.Text.ToUpper())
                || i.Nome_3.ToUpper().Contains(txtBusca.Text.ToUpper())
                || i.Nome_4.ToUpper().Contains(txtBusca.Text.ToUpper())
                || i.Nome_5.ToUpper().Contains(txtBusca.Text.ToUpper())).OrderBy(i => i.Numero_Apartamento).ToList();

            //Na mudança de pagina, chama o evento de aparecer a lista
            grdHospedes.PageIndex = e.NewPageIndex;

            //popular gridView
            grdHospedes.DataSource = fluxoHospedes;
            grdHospedes.DataBind();

        }


        /// <summary>
        /// Evento de click em algum dos botões 
        /// </summary>
        protected void grdHospedes_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            //Verifica qual o botão que o usuário clicou
            if (e.CommandName == "contaReserva")
            {
                //Recupera os parametros necessarios
                string apartamento = grdHospedes.Rows[Convert.ToInt16(e.CommandArgument)].Cells[1].Text;
                string ID = grdHospedes.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text;
                string dataCheckIn = grdHospedes.Rows[Convert.ToInt16(e.CommandArgument)].Cells[7].Text;


                Page page = (Page)HttpContext.Current.Handler;

                string script;
                script = @"window.open(""{0}"", ""{1}"");";

                //mecanismo em javaScript para abrir a página em outra janela
                script = String.Format(script, "./ExibirConta.aspx?apartamento=" + apartamento + "&id=" + ID + "&checkIn=" + dataCheckIn, "_blank");

                //Script que abre outra janela com a conta do hóspede
                ScriptManager.RegisterStartupScript(page, typeof(Page), "Redirect", script, true);


            }
            if (e.CommandName == "efetuarCheckOut")
            {
                string apartamento = grdHospedes.Rows[Convert.ToInt16(e.CommandArgument)].Cells[1].Text;
                string id = grdHospedes.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text;

                //chama o servico que desliga o funcionario do hotel e verifica se o funcionário foi excluido
                if (servico.EfetuarCheckOut(id, apartamento))
                {
                    //Remove o cache para atualizar informação
                    HttpContext.Current.Cache.Remove("Lista_Fluxo_Hospedes_Agora");
                    HttpContext.Current.Cache.Remove("Lista_Fluxo_Hospedes_Antigos");
                    
                    if (Convert.ToInt32(id) % 2 == 0)
                    {
                        MensagemJS("Check-out efetuado com sucesso!");
                    }
                    else
                    {
                        MensagemJS("Check-out efetuado e email com a fatura enviado com sucesso!");
                    }
                  
                }
                else
                {
                    MensagemJS("ERRO: Check-out não efetuado, verifique conexão com a internet!");
                }

                //Faz o reload da pagina para não perder os valores 
                ReloadGridView();

            }
            if (e.CommandName == "extenderEstadia")
            {
                //prepara os parametros da url
                string ID = grdHospedes.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text;
                string apartamento = grdHospedes.Rows[Convert.ToInt16(e.CommandArgument)].Cells[1].Text;
                string data_Inicial = grdHospedes.Rows[Convert.ToInt16(e.CommandArgument)].Cells[7].Text;
                string data_Final = grdHospedes.Rows[Convert.ToInt16(e.CommandArgument)].Cells[8].Text;
               

                //Redireciona para a pagina de extender estadia
                Response.Redirect("~/Apresentacao/FluxoHospedesAgora/ExtenderEstadiaHospede.aspx?id=" + ID + "&apartamento=" + apartamento + "&dataInicio=" + data_Inicial + "&dataFim=" + data_Final);

            }
            if (e.CommandName == "trocarCelular")
            {
                //prepara os parametros da url
                string ID = grdHospedes.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text;        
                //Redireciona para a pagina de extender estadia
                Response.Redirect("~/Apresentacao/FluxoHospedesAgora/TrocarCelularSMS.aspx?id=" + ID);

            }

        }

        /// <summary>
        /// Evento chamado a cada nova linha criada. O evento verificará se o esta na data de fazer o check-out
        /// </summary>
        protected void grdHospedes_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                string apartamento = (DataBinder.Eval(e.Row.DataItem, "Numero_Apartamento")).ToString();
                ((LinkButton)e.Row.Cells[11].Controls[0]).OnClientClick = "return confirm('Confirmar que houve o pagamento: Fazer o Check-Out do(s) hóspede(s) do apartamento " + apartamento + "?');";


                //pega a data de check-out
                DateTime dataCheckOut = Convert.ToDateTime(DataBinder.Eval(e.Row.DataItem, "Data_Saida").ToString());

                //verifica se a data de chac-out eh menor ou igual a de hoje
                if (dataCheckOut.Date <= DateTime.Now.Date)
                {
                    e.Row.Cells[8].BackColor = Color.OrangeRed;
                    e.Row.Cells[8].ForeColor = Color.White;
                }
            }
        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            ScriptManager.RegisterStartupScript(this,

                    this.GetType(),

                    "Mensagem",

                    string.Format("alert" + "('" + msg + "')"),

                    true);

        }
    }
}